#include <iostream>
#include <jsoncpp/json/json.h>
#include <boost/algorithm/string.hpp>

#include <signal.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/resource.h>

/*
    int getrlimit(int resource, struct rlimit *rlim);
    int setrlimit(int resource, const struct rlimit *rlim);
*/

void handler(int signum)
{
    std::cout << "signum: " << signum << std::endl;
}

// 设置进程占用的资源
void test_setrlimit()
{

    for (int i = 1; i <= 31; ++i)
    {
        signal(i, handler);
    }

    // struct rlimit {
    //         rlim_t rlim_cur;  /* Soft limit */
    //         rlim_t rlim_max;  /* Hard limit (ceiling for rlim_cur) */
    // };

    // 限制一共只能被cpu调度1秒
    struct rlimit rcpu;
    rcpu.rlim_cur = 1;
    rcpu.rlim_max = RLIM_INFINITY;
    setrlimit(RLIMIT_CPU, &rcpu);
    while (true)
    {
    }

    // // 限制进程占用的内存
    // struct rlimit rmem;
    // rmem.rlim_cur=50*1024*1024;
    // rmem.rlim_max=RLIM_INFINITY;

    // setrlimit(RLIMIT_AS,&rmem);

    // int count=0;
    // while(true) {
    //     int *p=new int[1024*1024];
    //     count++;

    //     std::cout<<"count: "<<count<<std::endl;
    //     sleep(1);
    // }
}

void test_json()
{
    Json::Value root;

    // Json对象 kv结构

    root["code"]="code...";
    root["status"]="status...";
    root["result"]="result...";

    // 序列化
    Json::StyledWriter writer; // 可读性强
    // Json::FastWriter writer;

    std::string str=writer.write(root);

    std::cout<<str<<std::endl;

    // 反序列化
    Json::Value rroot;
    Json::Reader reader;

    if(reader.parse(str,rroot)) {
        std::cout<<root["code"].asString()<<std::endl;
    }

    // // Json数组
    // root.append(1);
    // root.append(1.1);
    // root.append(true);
    // root.append("abc");

    // for (int i = 0; i < root.size(); ++i)
    // {
    //     if (root[i].isInt())
    //     {
    //         std::cout << root[i].asInt() << " ";
    //     }
    //     else if (root[i].isBool())
    //     {
    //         std::cout << root[i].asBool() << " ";
    //     }
    //     else if (root[i].isDouble())
    //     {
    //         std::cout << root[i].asDouble() << " ";
    //     }
    //     else if (root.isString())
    //     {
    //         std::cout << root[i].asString() << " ";
    //     }
    //     std::cout<<std::endl;
    // }

    // Json::Value::iterator it = root.begin();

    // while(it!=root.end())
    // {
    //     std::cout<<it->asString()<<std::endl;
    //     ++it;
    // }
}

void test_boost_split() {

    std::string str="2:使用最小花费爬楼梯:::简单:1:50000";

    std::vector<std::string> tokens;
    // boost::algorithm::token_compress_off: 不会压缩sep
    boost::split(tokens,str,boost::is_any_of(":"),boost::algorithm::token_compress_on);

    for(const auto& e : tokens)
    {
        std::cout<<e<<std::endl;
    }
}

int main()
{

    // test_setrlimit();
    // test_json();
    test_boost_split();

    return 0;
}